package com.yc.fav.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yc.fav.Utils;
import com.yc.fav.entity.Fav;
import com.yc.fav.entity.Tag;
import com.yc.fav.entity.TagFav;
import com.yc.fav.mapper.FavMapper;
import com.yc.fav.mapper.TagFavMapper;
import com.yc.fav.mapper.TagMapper;
import com.yc.fav.service.BizException;
import com.yc.fav.service.IFavService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author ly
 * @since 2024-08-05
 */
@Service
public class FavServiceImpl extends ServiceImpl<FavMapper, Fav> implements IFavService {

    @Autowired
    TagMapper tagMapper;

    @Autowired
    TagFavMapper tagFavMapper;


    @Override
    @Transactional(rollbackFor = BizException.class)
    public void add(Fav fav) throws BizException {
        // 字段验证
        Utils.checkEmpty(fav.getName(),"名称不能为空!");
        Utils.checkEmpty(fav.getAddr(),"地址不能为空!");
        Utils.check(fav.getName().length()<2,"名称不能少于2个字符!");
        // TODO 其他字段请自行扩展

        // 新增地址
        this.save(fav);

        // 门户;新闻;   ....
        String[] tags = fav.getTags().split("[;\\s；，,]+");

        for (String tag : tags) {
            if(tag.isBlank())continue;
            // 查询分类
            LambdaQueryWrapper<Tag> lqw = new LambdaQueryWrapper<>();
            lqw.eq(Tag::getUid, fav.getUid());
            lqw.eq(Tag::getName, tag);
            Tag dbtag = tagMapper.selectOne(lqw);
            if(dbtag == null){
                // 没有该类
                dbtag = new Tag();
                dbtag.setUid(fav.getUid());
                dbtag.setName(tag);
                tagMapper.insert(dbtag);
            } else {
                // 已有该类
            }
            TagFav tf = new TagFav();
            tf.setFid(fav.getId());
            tf.setTid(dbtag.getId());
            tagFavMapper.insert(tf);
        }
    }

    @Override
    public void modify(Fav fav) throws BizException {
        // 字段验证
        Utils.checkEmpty(fav.getName(),"名称不能为空!");
        Utils.checkEmpty(fav.getAddr(),"地址不能为空!");
        Utils.check(fav.getName().length()<2,"名称不能少于2个字符!");

        this.updateById(fav);

        String[] tags = fav.getTags().split("[;\\s；，,]+");

        // A;B;C
        // B;C;D
        // 删`除该链接原有的关联的记录, 重新生成关联记录(中间表)`
        LambdaQueryWrapper<TagFav> lqw1 = new LambdaQueryWrapper<>();
        lqw1.eq(TagFav::getFid, fav.getId());
        tagFavMapper.delete(lqw1);

        for (String tag : tags) {
            if(tag.isBlank())continue;
            // 查询分类
            LambdaQueryWrapper<Tag> lqw = new LambdaQueryWrapper<>();
            lqw.eq(Tag::getUid, fav.getUid());
            lqw.eq(Tag::getName, tag);
            Tag dbtag = tagMapper.selectOne(lqw);
            if(dbtag == null){
                // 没有该类
                dbtag = new Tag();
                dbtag.setUid(fav.getUid());
                dbtag.setName(tag);
                tagMapper.insert(dbtag);
            } else {
                // 已有该类
            }
            TagFav tf = new TagFav();
            tf.setFid(fav.getId());
            tf.setTid(dbtag.getId());
            tagFavMapper.insert(tf);
        }

        // 可选操作, 删除没有链接的分类, 也可以不删, 在页面过滤出去
    }
}
